//
//  main.cpp
//  数据结构
//
//  Created by 马鹏朔 on 2022/10/10.
//
//#include "stdio.h"
//#include "stdlib.h"
//#include "math.h"
//#define null 0
//typedef struct
//{
//     float coef;
//     int expn;
//}term;//这是创建系数和指数
//
//typedef  int status;
//
//typedef struct Lnode
//{
//    term data;
//    struct Lnode *next;
//}*Link,*Linklist;//这是定义节点的结构
//
//void initlist(Linklist &L)
//{
//    L=(Link)malloc(sizeof(Lnode));//开辟长度Lnode类型空间 q就成为了一个节点
//    L->next=null;
//}
//
//int cmp(term a,term b)// 比较指数的大小并返回不同的值，返回不同的值有不同的作用
//{
//    if (a.expn==b.expn)
//      return 0;
//    else
//      return (a.expn-b.expn)/abs(a.expn-b.expn);//abs是一个求绝对值的函数
//}
//
//void Orderinsert(Linklist &L,term e,int (*comp)(term,term))//插入（e）一个节点，L在创建的时候以指数从小到大排列的
//{
//    Link o,p,q;
//    q=L;
//    p=q->next;
//    while (p&&comp(p->data,e)<0)//q一直是p的上一个节点的地址
//    {
//        q=p;
//        p=p->next;
//    }
//    o=(Link)malloc(sizeof(Lnode));
//    o->data=e;
//    q->next=o;
//    o->next=p;
//}
//
//status LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term))//查找e
//{
//    Link p;s=L;
//    p=s->next;
//    while (p&&comp(p->data,e)!=0)
//    {
//        s=p;
//        p=p->next;
//    }
//    if(!p)
//    {
//        s=q=null;
//        return 0;
//    }//没找到
//    else
//    {
//        q=p;
//        return 1;
//    }
//}
//
//void Delnext(Linklist &L,Link s)//删掉系数相加减抵消的节点 并释放空间
//{
//     Link q=s->next;
//     s->next=q->next;
//     free(q);
//}
//
//void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term))//*compara是定义一个指针指向这个cmp函数
//{
//    Link q,s;
//    if (LocateElem(L,e,s,q,compara))//找到e进行系数相加减
//    {
//        q->data.coef+=e.coef;
//        if (!q->data.coef)//如果为零就执行删除节点函数，不为零就是原函数相加减
//        {
//         Delnext(L,s);
//        }
//    }
//    else  Orderinsert(L,e,compara);//没找到e在多项式插入e 并以从小到大的顺序进行插入
//}
//
//void Creatpolyn (Linklist &p,int m)// 创造多项式
//{
//    term e;
//    int i;
//    p=(Link)malloc(sizeof(Lnode));//开辟长度Lnode类型空间 q就成为了一个节点
//    p->next=null;
//    printf("\n请输入%d个系数和指数用空格符间隔：\n",m);
//    for(i=1;i<=m;i++)
//    {
//      scanf("%f%d",&e.coef,&e.expn);
//      Orderinsertmerge(p,e,cmp);//利用此函数找到相同指数的项进行相加减 ，防止出现X^2+2X^2的情况
//    }
//}
//
//void add(Linklist &La,Linklist Lb)
//{
//    Link qb;term b;
//    qb=Lb->next;
//    while(qb)
//    {
//        b=qb->data;
//        Orderinsertmerge(La,b,cmp);
//        qb=qb->next;
//    }
//    
// }
// 
//int distory(Linklist &L)
//{
//    while(L!=null)
//    {
//        Link p=L;
//        L=L->next;
//        delete p;
//    }
//    return 0;
//}
//void Danmulty(Linklist La,term e,Linklist &L)
//{
//    
//    Link pa=L;
//    term n=e;
//    for(Link pb=La->next;pb;pb=pb->next)
//    {
//        e=n;
//        e.coef=pb->data.coef*e.coef;
//        e.expn+=pb->data.expn;
//        Orderinsertmerge(pa,e,cmp);
//    }
//}
//
//void duomulty(Linklist La,Linklist Lb,Linklist &Lc)
//{
//    Link p;
//    p=Lb->next;
//    term i;
//    for(i=p->data;p;p=p->next)
//    {
//        i=p->data;
//        Link Ld;
//        initlist(Ld);
//        Danmulty(La,i,Ld);
//        add(Lc,Ld);
//        distory(Ld);
//    }
//}
//
//void printpolyn(Linklist p)//输出多项式
//{
//    Link q;
//    q=p->next;
//    int i=1;
//    while(q)
//    {
//        if(i==1)
//            printf("%4.2fX^%-d",q->data.coef,q->data.expn);
//        if(q->data.coef>0&&i>1)
//            printf("+%4.2fX^%d",q->data.coef,q->data.expn);
//        if(q->data.coef<0)
//            printf("%4.2fX^%-d",q->data.coef,q->data.expn);
//        q=q->next;
//        i++;
//    }
//    printf("\n");
//}
//
//int main()
//{
//    int x;
//    term i;
//    Linklist L1,L2,L3;//分别为两个多项式的头指针
//    printf("\n请输入第一个一元多项式的项数:");
//    scanf("%d",&x);
//    Creatpolyn(L1,x);//创建第一个多项式
//    printpolyn(L1);//L1指针还是头指针不变
//    printf("\n请输入第二个一元多项式的项数:");
//    scanf("%d",&x);
//    Creatpolyn(L2,x);//创建第二个多项式
//    printpolyn(L2);
//    initlist(L3);
//    duomulty(L1,L2,L3);
//    printf("\n相乘以后的一元多项式为\n");
//    printpolyn(L3);
//}
